package com.klm.easymq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 重试策略注解
 * 用于配置消息处理失败时的重试策略
 */
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {
    
    /**
     * 最大重试次数
     * 默认3次
     */
    int maxAttempts() default 3;
    
    /**
     * 重试间隔（毫秒）
     * 默认1000毫秒
     */
    long interval() default 1000;
    
    /**
     * 退避策略
     */
    BackoffPolicy backoffPolicy() default BackoffPolicy.FIXED;
    
    /**
     * 退避倍数（用于指数退避）
     * 默认2.0
     */
    double multiplier() default 2.0;
    
    /**
     * 最大重试间隔（毫秒）
     * 默认10000毫秒
     */
    long maxInterval() default 10000;
    
    /**
     * 重试异常类型
     * 默认重试所有异常
     */
    Class<? extends Throwable>[] retryableExceptions() default {};
    
    /**
     * 不重试的异常类型
     */
    Class<? extends Throwable>[] noRetryExceptions() default {};
    
    /**
     * 退避策略
     */
    enum BackoffPolicy {
        /**
         * 固定间隔
         */
        FIXED,
        
        /**
         * 指数退避
         */
        EXPONENTIAL,
        
        /**
         * 随机退避
         */
        RANDOM
    }
} 